package com.follow.common;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;

public class ExportExcel<T> {
    /**
     *
     * @param name 导出的文件名称
     * @param sheetName sheetb表格名称
     * @param headers  导出的头部信息
     * @param result 导出的数据
     */
    public Workbook export(String name, String sheetName, String[] headers, List<T> result) throws Exception {

        //excel 2003 xls  2007xlsx
        Workbook workbook = null;
        if (name != null && !"".equals(name)){
            //传入的name以xls为结尾，创建2003版的文件
            if (name.endsWith(".xls")){
                workbook = new HSSFWorkbook();
            }else if (name.endsWith(".xlsx")){//2007版
                workbook = new XSSFWorkbook();
            }else {
                workbook = new HSSFWorkbook();
            }
        }else {
            //如果没有文件名称，则创建2003版的excel表格
            workbook = new HSSFWorkbook();
        }
        //创建sheet名
        Sheet sheet = workbook.createSheet(sheetName);
        //调用方法进行数据写入
        firstRowNum(sheet,headers);
        otherReoNum(sheet,result);
        //将数据写入文件
        return workbook;
    }

    //写入表头第一排的属性
    private void firstRowNum(Sheet sheet,String[] henders){
        //创建sheet行
        Row row = sheet.createRow(0);
        //循环遍历列名属性
        for (int i = 0; i < henders.length ; i++) {
            //创建单元格
            Cell cell = row.createCell(i);
            //表头的一排单元格内放入的列名值
            cell.setCellValue(henders[i]);
        }
    }
    //写入属性中的值(填入excel表格中的数据)
    private void otherReoNum(Sheet sheet ,List<T> result) throws  Exception{
        for (int i = 0; i < result.size() ; i++) {

            //创建第二排填入列名的内容(i+1)
            Row row = sheet.createRow(i+1);
            //获取集合中的泛型
            T t = result.get(i);
            //根据泛型获取泛型类的反射对象
            Class aClass = t.getClass();
            //获取类型中的所有属性
            Field[] declaredFields = aClass.getDeclaredFields();
            //遍历循环所有属性
            for (int j = 0; j <declaredFields.length ; j++) {
                Cell cell = row.createCell(j);
                //获取属性名称
                String name = declaredFields[j].getName();
                    //获取get方法名称
                    String methodName = "get" + name.substring(0,1).toUpperCase()+name.substring(1);
                    //获取方法
                    Method method = aClass.getMethod(methodName, null);
                    //执行方法，获得结果
                    Object invoke = method.invoke(t, null);
                    String values = "";
                    //判断属性值是否为空
                    if (invoke != null) {
                        values = invoke.toString();//如果方法的到的结果不为空，将结果转换为字符串
                        if (name.equals("status")) {
                            if (values.equals("1")) {
                                values = "正常";
                            } else if (values.equals("2")) {
                                values = "异常";
                            }
                        }
                        if (name.equals("tradingStatus")) {
                            if (values.equals("1")) {
                                values = "正常";
                            } else if (values.equals("2")) {
                                values = "暂停交易";
                            }
                        }
                        if (name.equals("supplyStatus")) {
                            if (values.equals("1")) {
                                values = "正常";
                            } else if (values.equals("2")) {
                                values = "暂停供货";
                            }
                        }
                        if (name.equals("checked")) {
                            if (values.equals("1")) {
                                values = "已选择";
                            } else if (values.equals("2")) {
                                values = "未选择";
                            }
                        }
                        if (name.equals("isDel")) {
                            if (values.equals("1")) {
                                values = "目录已删除";
                            } else if (values.equals("2")) {
                                values = "目录未删除";
                            }
                        }
                    }
                    cell.setCellValue(values);
            }
        }
    }
}
